#pragma once

<%- getApiDefine(api) %>

#include "playfab/PlayFabHttp.h"
#include "playfab/PlayFab<%- api.name %>DataModels.h"

namespace PlayFab
{
    /// <summary>
    /// Main interface for PlayFab Sdk, specifically all <%- api.name %> APIs
    /// </summary>
    class PlayFab<%- api.name %>API
    {
    public:
        static size_t Update();
        static void ForgetAllCredentials();

<% if (hasClientOptions) { %>
        // Public, Client-Specific
        static bool IsClientLoggedIn();
<% } %>
        // ------------ Generated API calls
<% for (var callIdx = 0; callIdx < api.calls.length; callIdx++) { var apiCall = api.calls[callIdx];
%>        static void <%- apiCall.name %>(<%- api.name %>Models::<%- apiCall.request %>& request, ProcessApiCallback<<%- api.name %>Models::<%- apiCall.result %>> callback, ErrorCallback errorCallback = nullptr, void* customData = nullptr);
<% } %>
    private:
        PlayFab<%- api.name %>API(); // Private constructor, static class should never have an instance
        PlayFab<%- api.name %>API(const PlayFab<%- api.name %>API& other); // Private copy-constructor, static class should never have an instance

        // ------------ Generated result handlers
<% for (var callIdx = 0; callIdx < api.calls.length; callIdx++) { var apiCall = api.calls[callIdx];
%>        static void On<%- apiCall.name %>Result(CallRequestContainer& request);
<% } %>
<% if (hasClientOptions) { %>
        // Private, Client-Specific
        static void MultiStepClientLogin(bool needsAttribution);
<% } %>    };
}

#endif
